package base.reflection_demo.demo_05;

import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

@Slf4j
public class MyInvocationHandler implements InvocationHandler {
    private Object target;

    // 接收被代理对象
    public MyInvocationHandler(Object target){
        this.target = target;
    }

    /**
     * TODO
     *  如果 return result 则代表 UserDaoImpl,否则 return ""代表的就是这个"" ,这是为啥???
     * invoke（）方法的作用：执行被代理对象的任何接口方法都会经过该方法。
     * @param proxy 代理对象的引用，如果想在方法中获取并使用代理对象，
     *              就可以操作proxy（DynamicProxyDemo1.proxyUserDao），一般用不到
     * @param method 代理方法
     * @param args 方法入参
     *
     * @return 和被代理对象方法有相同的返回值
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//        System.out.println(proxy);//内存溢出
        log.info("权限校验");
        Object result = method.invoke(target, args);// 通过反射调用 target对象上的 method方法,返回返回值
        log.info("日志记录");
        log.info("Handler ->  proxy:{}, method:{}, args:{}, result:{}", proxy,method,args,result);
        return result;
    }
}
